/*
******************************************************************************************************* 
**  Copyright (C) 2019, 苏州检易生物科技有限公司 
**  All rights reserved. 
** 
**  FileName:       	motor.h
**  Description:	
**  Author:        	 
**  Version				v0.1
**  Date:           	2019-06-29
**	Function List： 
**  History:         
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                              	防止重复包含
*********************************************************************************************************
*/

#ifndef _MOTOR_PROCESS_H_
#define _MOTOR_PROCESS_H_
/*
*********************************************************************************************************
*                                              	调试开关
*********************************************************************************************************
*/



/*
*********************************************************************************************************
*                                              	头文件
*********************************************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stm32h7xx_hal.h"
#include <rtthread.h>
#include "motor.h"
/*
*********************************************************************************************************
*                                              	宏定义
*********************************************************************************************************
*/
/*电机动作流程控制: 记录sdo待发送数量 
	只有在sdo_cnt为零的时候RX_CALLBACK才能修改电机状态
	在sdo rx的时候sdo_cnt--
	速度模式:写入速度 直接修改电机状态
	位置模式:写入目标位置 直接修改电机状态
	页面探测:写入页面探测使能 & 写入极限位置 直接修改电机状态
	刹车:将速度写为0
	回零:写入回零模式
*/
//#define	MOTOR_DEVICE1_CAN_ID				0x0001
//#define	MOTOR_DEVICE2_CAN_ID				0x0001

#define ACT_PARA_MOTOR_INDEX			0
#define ACT_PARA_POS_INDEX				1
#define ACT_PARA_ARG_INDEX				2
#define ACT_PARA_SPEED_INDEX			3
#define ACT_PARA_EXTRA_INDEX			4

/*各个电机状态下 轮询间隔*/
#define MOTOR_STEP_POLL_FREQ			10
#define MOTOR_HALT_POLL_FREQ			10
#define MOTOR_SURFACE_POLL_FREQ		5
#define MOTOR_HOMING_POLL_FREQ		20
#define MOTOR_CHECK_POLL_FREQ			100
#define MOTOR_SPEED_POLL_FREQ			100
/*一次最多轮询多少个电机*/
#define MOTOR_POLL_MAX						20

#define MOTOR_SPEED_LIMIT					2500
/*
*********************************************************************************************************
*                                              枚举和结构体类型定义
*********************************************************************************************************
*/
//typedef void (*motor_ticks_cb)(uint8_t motor_id, uint16_t cnt);

//typedef void (*motor_timeout_cb)(uint8_t motor_id);

//typedef void (*motor_err_cb)(uint8_t motor_id);

typedef enum{
	MOTOR_SYN = 0,
	MOTOR_ASYN = 1,
}motor_syn_t;

/*
*********************************************************************************************************
*                                              	全局变量声明
*********************************************************************************************************
*/
//extern uint32_t	 g_motor_state;
/*
*********************************************************************************************************
*                                              	函数声明
*********************************************************************************************************
*/
/*配置电机模式 速度*/
uint8_t	motor_config(uint8_t motor_id,void* p_schedule_cb,motor_mode_t mode);
/*配置电机整圈循环模式*/
uint8_t motor_circle(uint8_t motor_id,int32_t circle_step);
/*配置电机默认速度，对于速度模式 则直接开始运动*/
uint8_t motor_speed(uint8_t motor_id);
/*速度模式下电机特例 速度 正反转*/
uint8_t motor_speed_ex(uint8_t motor_id,int16_t rpm);
/*将速度写为0 刹车*/
uint8_t motor_halt(uint8_t motor_id);
/*电机归零*/
uint8_t motor_home(uint8_t motor_id);
uint8_t motor_home_mode(uint8_t motor_id,uint8_t mode);
/*同步电机当前步数,等待电机空闲*/
uint8_t motor_wait(uint8_t motor_id);
/*同步电机当前步数,等待电机复位完成*/
uint8_t motor_wait_init(uint8_t motor_id);
/*电机绝对位置运动*/
uint8_t motor_pos(uint8_t motor_id, uint8_t next_pos,uint32_t arg);
/*电机绝对位置运动*/
uint8_t motor_pos_asyn(uint8_t motor_id,uint8_t next_pos,uint32_t arg);
/*电机相对位置运动*/
uint8_t motor_step(uint8_t motor_id,uint8_t pos,uint32_t arg);
/*页面探测*/
uint8_t motor_surface(uint8_t motor_id,uint8_t next_pos,uint32_t surface_mode,uint32_t arg);
/*页面探测校准*/
uint8_t motor_surface_calib(uint8_t motor_id);
uint8_t motor_surface_wait_calib(uint8_t motor_id);
/*将驱动板的当前位置同步至上位机*/
uint8_t motor_syn(uint8_t motor_id);
/*将当前目标位置写入下位机目标位置寄存器*/
uint8_t motor_write_tar(uint8_t motor_id);
/*液面探测结束后检查液面探测状态*/
uint8_t motor_check_surface(uint8_t motor_id);
/*将电机去使能*/
uint8_t motor_release(uint8_t motor_id,void* p_schedule_cb);
uint8_t motor_reverse(uint8_t motor_id);
uint8_t motor_poll(motor_t* p_motor);
void		motor_poll_all(void);
/*使能电机限位光电,主要用于针防碰撞*/
uint8_t motor_collision_protect(uint8_t motor_id,uint32_t type);
uint8_t motor_check_idle(uint8_t motor_id);

uint8_t motor_disable(uint8_t motor_id);
int32_t motor_read_enc(uint8_t motor_id);
#endif
